﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Fuyao.Business.Entities.Models;
using System.Data;
using System.Data.SqlClient;
using System.Xml.Linq;

namespace Fuyao.Data.SQLServer.DAO
{
    public class DAOPerfil
    {
        string strCnx = clsConexionDB.getConexionSQL();

        public List<Perfil> getPerfil()
        {

            Perfil oPerfil = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);
            List<Perfil> listPerfil = new List<Perfil>();

            try
            {
                strCommand.Append("SELECT PerfilID,UPPER(DescripcionPerfil) DescripcionPerfil,Estado from perfil where Estado = @Estado");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);

                sqlCommand.Parameters.Add("@Estado", SqlDbType.Bit).Value = true;

                cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                while (dr.Read())
                {
                    oPerfil = new Perfil();
                    if (!Convert.IsDBNull(dr["PerfilID"])) oPerfil.PerfilID = Convert.ToInt32(dr["PerfilID"]);
                    if (!Convert.IsDBNull(dr["DescripcionPerfil"])) oPerfil.DescripcionPerfil = Convert.ToString(dr["DescripcionPerfil"]);
                    if (!Convert.IsDBNull(dr["Estado"])) oPerfil.Estado = Convert.ToBoolean(dr["Estado"]);
                    listPerfil.Add(oPerfil);                    
                }

                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return listPerfil;
        }

        public bool insertarPerfil(Perfil oPerfilSeleccionado, List<MenuXPerfil> listMenuXPerfil)
        {
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);
            bool result = false;
            try
            {
                strCommand.Append("FYAO_InsertPerfil_MenuxPerfil");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.StoredProcedure;

                sqlCommand.Parameters.Add("@DescripcionPerfil", SqlDbType.VarChar, 50).Value = oPerfilSeleccionado.DescripcionPerfil;
                sqlCommand.Parameters.Add("@Estado", SqlDbType.Bit).Value = true;
                sqlCommand.Parameters.Add("@XML", SqlDbType.Xml).Value = getItemLinqXML_InsertMenuxPerfil(listMenuXPerfil);

                cnx.Open();
                if (sqlCommand.ExecuteNonQuery() > 0) 
                    result = true;              
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return result;
        }

        public bool actualizarPerfil(Perfil oPerfilSeleccionado, List<MenuXPerfil> listMenuXPerfil)
        {
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);
            bool result = false;
            try
            {
                strCommand.Append("FYAO_UpdatePerfil_MenuxPerfil");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.StoredProcedure;

                sqlCommand.Parameters.Add("@PerfilID", SqlDbType.Int).Value = oPerfilSeleccionado.PerfilID;
                sqlCommand.Parameters.Add("@DescripcionPerfil", SqlDbType.VarChar, 50).Value = oPerfilSeleccionado.DescripcionPerfil;
                sqlCommand.Parameters.Add("@XML", SqlDbType.Xml).Value = getItemLinqXML_UpdateMenuxPerfil(listMenuXPerfil);

                cnx.Open();
                if (sqlCommand.ExecuteNonQuery() > 0)
                    result = true;
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return result;
        }

        private string getItemLinqXML_InsertMenuxPerfil(List<MenuXPerfil> listMenuXPerfil)
        {
            var xEle = new XElement("ITEMS",//raiz
                            from item in listMenuXPerfil
                            select new XElement("ITEM",//nodo
                                   new XAttribute("MenuID", item.MenuID))); //atributos                                  
            return xEle.ToString();
        }

        private string getItemLinqXML_UpdateMenuxPerfil(List<MenuXPerfil> listMenuXPerfil)
        {
            var xEle = new XElement("ITEMS",//raiz
                            from item in listMenuXPerfil
                            select new XElement("ITEM",//nodo                                    
                                   new XAttribute("MenuID", item.MenuID),
                                   new XAttribute("PerfilID", item.PerfilID))); //atributos                                  
            return xEle.ToString();
        }       
    }
}
